package LeetCode.interview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import LeetCode.interview._104_Maximum_Depth_of_Binary_Tree.TreeNode;

import sun.tools.jar.resources.jar;
import util.LogUtils;

/*
 * 
原题　
	Say you have an array for which the ith element is the price of a given stock on day i. 
	　　If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), 
		design an algorithm to find the maximum profit. 
题目大意
	给一个数组prices[]，prices[i]代表股票在第i天的售价，求出只做一次交易(一次买入和卖出)能得到的最大收益。
解题思路
	　　只需要找出最大的差值即可，即 max(prices[j] – prices[i]) ，i < j。
		一次遍历即可，在遍历的时间用遍历low记录 prices[o….i] 中的最小值，就是当前为止的最低售价，时间复杂度为 O(n)。 
   @Type 动态规划
 * @Date 2017-09-17 23：50
 */
public class _121_Best_Time_to_Buy_and_Sell_Stock {
	 public int maxProfit(int[] prices) {
		 if (prices==null || prices.length<2)	return 0;
		 int min = prices[0];
		 int profit = 0;			//收益
		 // 第i天的价格price[i] 可以看作是买入价也可以看作是卖出价
		 for (int i = 1; i < prices.length; i ++) {
			 if (prices[i] < min) {							// 找到更低的买入价
				 min = prices[i];							// 更新买入价
			 } else {
				 if (profit < prices[i]-min)				// 如果当天买出的价格比之前卖出的价格高
					 profit = prices[i]-min;				// 更新卖出价	 
			 }
		 }
		 return profit;
	 }
	
	public void traverse(int[] nums) {
		for (int i : nums) {
			LogUtils.print(i);
		}
	}
    
	public static void main(String[] args) {
		_121_Best_Time_to_Buy_and_Sell_Stock obj = new _121_Best_Time_to_Buy_and_Sell_Stock();

		obj.maxProfit(new int[]{3, 2, 4});
	}

}
